#!/bin/bash

# 加载路径配置
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/../config/paths.conf"

LOCK_FILE="$TEMP_DIR/traffic_monitor_cleanup.lock"
MAX_DAYS=3          # 保留最近3天的日志
MAX_ARCHIVE_DAYS=30 # 保留最近30天的归档
MAX_DISK_USAGE=80   # 最大磁盘使用率

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'

log() {
    echo -e "${GREEN}[$(date '+%Y-%m-%d %H:%M:%S')]${NC} $1"
}

warn() {
    echo -e "${YELLOW}[警告]${NC} $1"
}

error() {
    echo -e "${RED}[错误]${NC} $1"
}

# 检查是否已有实例在运行
check_lock() {
    if [ -f "$LOCK_FILE" ]; then
        local pid=$(cat "$LOCK_FILE")
        if kill -0 "$pid" 2>/dev/null; then
            error "已有清理进程在运行 (PID: $pid)"
            exit 1
        else
            warn "发现陈旧的锁文件，清理中..."
            rm -f "$LOCK_FILE"
        fi
    fi
    echo $$ > "$LOCK_FILE"
}

# 清理锁文件
cleanup_lock() {
    rm -f "$LOCK_FILE"
    log "清理完成，锁文件已移除"
}

# 信号处理
trap cleanup_lock EXIT INT TERM

# 检查磁盘使用率
check_disk_usage() {
    local usage=$(df "$BASE_DIR" | awk 'NR==2 {print $5}' | sed 's/%//')
    echo $usage
}

# 安全删除函数
safe_delete() {
    local pattern=$1
    local desc=$2
    
    log "清理${desc}..."
    find $pattern -mtime +$MAX_DAYS -type f | while read file; do
        if [ -f "$file" ]; then
            rm -f "$file" && log "  删除: $(basename $file)" || warn "  删除失败: $file"
        fi
    done
}

# 自动清理函数
auto_cleanup() {
    check_lock
    
    local disk_usage=$(check_disk_usage)
    local original_usage=$disk_usage
    
    log "开始自动清理 - 当前磁盘使用率: ${disk_usage}%"
    
    # 清理临时目录
    log "清理临时目录..."
    rm -rf $TEMP_DIR/*
    mkdir -p $TEMP_DIR
    
    # 安全清理旧日志文件
    safe_delete "$LOG_DIR -name \"*.pcap\"" "PCAP日志文件"
    safe_delete "$LOG_DIR -name \"*.log\"" "文本日志文件"
    
    # 清理旧归档
    log "清理超过${MAX_ARCHIVE_DAYS}天的归档..."
    find $ARCHIVE_DIR -name "*.tar.gz" -mtime +$MAX_ARCHIVE_DAYS -type f | while read file; do
        if [ -f "$file" ]; then
            rm -f "$file" && log "  删除归档: $(basename $file)" || warn "  删除归档失败: $file"
        fi
    done
    
    # 检查清理效果
    disk_usage=$(check_disk_usage)
    log "初步清理后磁盘使用率: ${disk_usage}%"
    
    # 如果磁盘使用率仍然过高，执行深度清理
    if [ $disk_usage -ge $MAX_DISK_USAGE ]; then
        warn "磁盘使用率仍然过高(${disk_usage}%)，执行深度清理..."
        
        # 清理所有超过1天的文件
        safe_delete "$LOG_DIR -name \"*.pcap\"" "所有超过1天的PCAP文件"
        safe_delete "$LOG_DIR -name \"*.log\"" "所有超过1天的日志文件"
        
        # 按大小排序，清理最大的几个文件（保留最近5个）
        log "按大小清理最大的PCAP文件..."
        find $LOG_DIR -name "*.pcap" -type f -printf "%T@ %s %p\n" | sort -nr | tail -n +6 | cut -d' ' -f3 | while read file; do
            if [ -f "$file" ]; then
                rm -f "$file" && log "  删除大文件: $(basename $file)" || warn "  删除大文件失败: $file"
            fi
        done
        
        # 再次检查磁盘使用率
        disk_usage=$(check_disk_usage)
        if [ $disk_usage -ge $MAX_DISK_USAGE ]; then
            error "深度清理后磁盘使用率仍然过高(${disk_usage}%)，请手动检查"
            return 1
        fi
    fi
    
    log "自动清理完成"
    log "原始磁盘使用率: ${original_usage}%"
    log "最终磁盘使用率: ${disk_usage}%"
    log "释放空间: $((original_usage - disk_usage))%"
    
    return 0
}

# 设置定时任务
setup_cron() {
    log "设置定时清理任务..."
    
    # 检查是否已存在任务
    if crontab -l 2>/dev/null | grep -q "auto_cleanup.sh"; then
        warn "定时清理任务已存在，跳过设置"
        return 0
    fi
    
    # 添加定时任务（每天凌晨3点执行清理）
    (crontab -l 2>/dev/null; echo "0 3 * * * $SCRIPTS_DIR/auto_cleanup.sh run >> $LOG_DIR/cleanup.log 2>&1") | crontab -
    
    if [ $? -eq 0 ]; then
        log "定时清理任务设置完成 (每天凌晨3点执行)"
    else
        error "定时任务设置失败"
        return 1
    fi
}

# 移除定时任务
remove_cron() {
    log "移除定时清理任务..."
    
    # 移除所有包含 auto_cleanup.sh 的定时任务
    crontab -l 2>/dev/null | grep -v "auto_cleanup.sh" | crontab -
    
    if [ $? -eq 0 ]; then
        log "定时清理任务已移除"
    else
        error "定时任务移除失败"
        return 1
    fi
}

# 显示状态
show_status() {
    log "=== 清理任务状态 ==="
    
    # 检查定时任务
    if crontab -l 2>/dev/null | grep -q "auto_cleanup.sh"; then
        log "定时任务: 已启用"
        crontab -l | grep "auto_cleanup.sh"
    else
        log "定时任务: 未启用"
    fi
    
    # 检查磁盘使用率
    local disk_usage=$(check_disk_usage)
    log "当前磁盘使用率: ${disk_usage}%"
    
    # 检查各目录大小
    log "各目录大小:"
    du -sh $LOG_DIR $ARCHIVE_DIR $TEMP_DIR 2>/dev/null
    
    # 检查锁文件
    if [ -f "$LOCK_FILE" ]; then
        local pid=$(cat "$LOCK_FILE")
        if kill -0 "$pid" 2>/dev/null; then
            warn "清理进程正在运行 (PID: $pid)"
        else
            warn "发现陈旧的锁文件"
        fi
    else
        log "无运行中的清理进程"
    fi
}

case "$1" in
    "run")
        auto_cleanup
        ;;
    "setup")
        setup_cron
        ;;
    "remove")
        remove_cron
        ;;
    "status")
        show_status
        ;;
    *)
        echo "用法: $0 {run|setup|remove|status}"
        echo "  run    - 执行一次清理"
        echo "  setup  - 设置定时清理任务"
        echo "  remove - 移除定时清理任务"
        echo "  status - 显示状态信息"
        exit 1
        ;;
esac